//package xijia.plus.docs.thymeleafuser.util;
//
//
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.core.io.ClassPathResource;
//import org.springframework.core.io.Resource;
//import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
//import org.springframework.core.io.support.ResourcePatternResolver;
//import org.springframework.util.ResourceUtils;
//import org.springframework.web.multipart.MultipartFile;
//
//import java.io.*;
//import java.net.URL;
//import java.net.URLConnection;
//import java.net.URLEncoder;
//import java.nio.file.Files;
//import java.nio.file.Path;
//import java.nio.file.Paths;
//import java.nio.file.StandardCopyOption;
//import java.text.SimpleDateFormat;
//import java.util.Date;
//import java.util.Random;
//
///**
// * 导入导出 文件工具
// *
// * @author wangsong
// * @version 1.0.0
// * @email 1720696548@qq.com
// * @date 2022/12/22 0022 21:16
// */
//@Slf4j
//public class ExportFileUtil {
//
//
//    /**
//     * 创建文件夹 | 判断文件路径是否存在，不存在创建
//     *
//     * @param path
//     * @return void
//     * @date 2019/11/22 15:18
//     */
//    public static void mkdirFile(String path) {
//        // 不存在创建文件夹
//        File file = new File(path);
//        if (!file.exists()) {
//            file.mkdirs();
//        }
//    }
//
//
//    /**
//     * 创建文件
//     *
//     * @param path 全路径 指向文件
//     * @return
//     */
//    public static boolean makeFile(String path) {
//        File file = new File(path);
//        if (file.exists()) {
//            log.info("文件已存在！");
//            return false;
//        }
//        if (path.endsWith(File.separator)) {
//            log.info("不能为目录！");
//            return false;
//        }
//        if (!file.getParentFile().exists()) {
//            if (!file.getParentFile().mkdirs()) {
//                log.info("创建目标文件所在目录失败！");
//                return false;
//            }
//        }
//        try {
//            if (file.createNewFile()) {
//                log.info("创建文件" + path + "成功！");
//                return true;
//            } else {
//                log.info("创建文件" + path + "失败！");
//                return false;
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//            log.info("创建文件" + path + "失败！" + e.getMessage());
//            return false;
//        }
//    }
//
//
//    /**
//     * 获取可访问的 url 的文件流
//     *
//     * @param filePath 可访问的url
//     * @param fileName 下载的文件名
//     * @return void
//     * @author wangsong
//     * @date 2020/8/26 0026 17:00
//     * @version 1.0.1
//     */
//    public static InputStream getInputStreamByUrl(String filePath, String fileName) {
//        String oldFilePath = filePath;
//
//        int index = filePath.lastIndexOf("/");
//        String newFilePath = filePath.substring(0, index + 1);
//        String newFileName = filePath.substring(index + 1);
//        InputStream in = null;
//        try {
//            // 编码
//            fileName = URLEncoder.encode(fileName.trim(), "utf-8");
//            // 处理空格
//            fileName = fileName.replaceAll("\\+", "%20");
//            URL url = new URL(newFilePath + fileName);
//            URLConnection conn = url.openConnection();
//            in = conn.getInputStream();
//            // in.close();
//        } catch (IOException e) {
//            log.error("错误： 尝试使用原连接获取");
//            try {
//                // 编码
//                URL url = new URL(oldFilePath);
//                URLConnection conn = url.openConnection();
//                in = conn.getInputStream();
//                log.error("使用原连接获取成功");
//            } catch (IOException e1) {
//                log.error(e1.toString());
//                log.error("使用原连接获取失败");
//            }
//        }
//        return in;
//    }
//
//
//    /**
//     * 文件上传 |  MultipartFile 转 File 返回
//     *
//     * @param multipartFile 上传文件
//     * @param path          保存地址
//     * @return 本地文件
//     */
//    public static void uploadZipFile(MultipartFile multipartFile, String path) {
//        // String fileName = System.currentTimeMillis() + "_" + multipartFile.getOriginalFilename();
//        // 创建放文件的目录
//        Path directory = Paths.get(path);
//        try {
//            // 判断目录是否存在，不存在创建
//            if (!Files.exists(directory)) {
//                Files.createDirectories(directory);
//            }
//            // 拷贝文件
//            Files.copy(multipartFile.getInputStream(), directory.resolve(multipartFile.getOriginalFilename()), StandardCopyOption.REPLACE_EXISTING);
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
//    }
//
//
//    /**
//     * 获取 resources | classpath 下指定的文件
//     *
//     * @author wangsong
//     * @email 1720696548@qq.com
//     * @date 2022/12/22 0022 21:06
//     * @version 1.0.0
//     */
//    public static InputStream getClasspathFile(String path) {
//        Resource resource = new ClassPathResource(path);
//        try {
//            return resource.getInputStream();
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
//    }
//
//    /**
//     * InputStream 转  file (getClasspathFile 获取的文件流可以通过这个方法保存到指定位置中)
//     *
//     * @param ins 文件流
//     * @param mkdir 文件路径
//     * @param fileName 文件名称
//     */
//    public static File inputStreamToFile(InputStream ins, String mkdir, String fileName) {
//        File file = new File(mkdir);
//        // 创建放文件的目录
//        if (!file.exists()) {
//            file.mkdirs();
//        }
//        OutputStream os = null;
//        try {
//            file = new File(mkdir + "/" + fileName);
//            // 创建放文件的目录
//            if (!file.exists()) {
//                file.createNewFile();
//            }
//            os = new FileOutputStream(file);
//            int bytesRead = 0;
//            byte[] buffer = new byte[8192];
//            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
//                os.write(buffer, 0, bytesRead);
//            }
//            os.flush();
//        } catch (FileNotFoundException e) {
//            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        } finally {
//            try {
//                os.close();
//                ins.close();
//            } catch (IOException e) {
//                throw new RuntimeException(e);
//            }
//        }
//        return file;
//    }
//
//
//    /**
//     * 当前运行环境资源文件是在jar里面的
//     *
//     * @param jarURLConnection
//     * @throws IOException
//     */
////    private static void copyJarResources(JarURLConnection jarURLConnection, String folderPath, String targetFolderPath, Class clazz) throws IOException {
////        JarFile jarFile = jarURLConnection.getJarFile();
////        Enumeration<JarEntry> entrys = jarFile.entries();
////        while (entrys.hasMoreElements()) {
////            JarEntry entry = entrys.nextElement();
////            if (entry.getName().startsWith(jarURLConnection.getEntryName()) && !entry.getName().endsWith("/")) {
////                loadRecourseFromJar("/" + entry.getName(), targetFolderPath, clazz);
////            }
////        }
////        jarFile.close();
////    }
//
////    public static void loadRecourseFromJar(String path, String recourseFolder, Class clazz) throws IOException {
////        if (!path.startsWith("/")) {
////            throw new IllegalArgumentException("The path has to be absolute (start with '/').");
////        }
////
////        if (path.endsWith("/")) {
////            throw new IllegalArgumentException("The path has to be absolute (cat not end with '/').");
////        }
////
////        int index = path.lastIndexOf('/');
////
////        String filename = path.substring(index + 1);
////        String folderPath = recourseFolder + path.substring(0, index + 1);
////
////        // If the folder does not exist yet, it will be created. If the folder
////        // exists already, it will be ignored
////        File dir = new File(folderPath);
////        if (!dir.exists()) {
////            dir.mkdirs();
////        }
////
////        // If the file does not exist yet, it will be created. If the file
////        // exists already, it will be ignored
////        filename = folderPath + filename;
////        File file = new File(filename);
////
////        if (!file.exists() && !file.createNewFile()) {
////            log.error("create file :{} failed .fileName:" + filename);
////            return;
////        }
////    }
//
//    /**
//     * 获取 classpath 下指定的文件
//     * 删除的是 target 目录
//     *
//     * @author wangsong
//     * @email 1720696548@qq.com
//     * @date 2022/12/22 0022 21:06
//     * @version 1.0.0
//     */
//    public static FileInputStream getFileInputStreamByPath(String path) {
//        // 读取目录文件打压缩包
//        try {
//            return new FileInputStream(ResourceUtils.getURL("classpath:").getPath() + "/" + path);
//        } catch (FileNotFoundException e) {
//            throw new RuntimeException(e);
//        }
//    }
//
//
//    /**
//     * 删除指定目录下的文件
//     *
//     * @author wangsong
//     * @email 1720696548@qq.com
//     * @date 2022/12/22 0022 21:06
//     * @version 1.0.0
//     */
////    public static void delFileByPath(String path) {
////        // 读取目录文件打压缩包
////        File basePath = null;
////        try {
////            basePath = new File(ResourceUtils.getURL("classpath:").getPath() + "/" + path);
////            FileUtil.clean(basePath);
////        } catch (FileNotFoundException e) {
////            throw new RuntimeException(e);
////        }
////    }
//
//    /**
//     * 复制单个文件 从classpath中读取文件复制
//     *
//     * @param path    不能以/开头   指向文件不能是目录
//     * @param newpath 指向文件不能是目录
//     */
//    public static void copyFileFromJar(String path, String newpath) {
//        try {
//            //创建新文件
//            makeFile(newpath);
//            //获取文件流
//            InputStream in = new String().getClass().getClassLoader().getResourceAsStream(path);
//            //将流写入新文件
//            write2File(in, newpath);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 复制path目录下所有文件
//     *
//     * @param path    文件目录 不能以/开头
//     * @param newpath 新文件目录
//     */
//    public static void dirCopyFileFromJar(String path, String newpath) {
//        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
//        try {
//            //获取所有匹配的文件
//            Resource[] resources = resolver.getResources(path + "/**");
//            //打印有多少文件
//            log.info("*****************" + resources.length);
//            for (int i = 0; i < resources.length; i++) {
//                Resource resource = resources[i];
//                String description = resource.getDescription();
//                URL url = resource.getURL();
//                // /G:/javacode/user/xj-docs/xj-doc-user/target/classes/static/static/assets/css/doc.css
//                String path1 = url.getPath();
//                System.out.println(path1);
//                // /assets/css/doc.css
//                String key = "/target/classes/" + path;
//                String filePath = path1.substring(path1.indexOf(key)).replace(key, "");
//                try {
//                    //以jar运行时，resource.getFile().isFile() 无法获取文件类型，会报异常，抓取异常后直接生成新的文件即可；以非jar运行时，需要判断文件类型，避免如果是目录会复制错误，将目录写成文件。
//                    if (resource.getFile().isFile()) {
//                        makeFile(newpath + "/" + filePath);
//                        InputStream stream = resource.getInputStream();
//                        write2File(stream, newpath + filePath);
//                    }
//                } catch (Exception e) {
//                    log.info("-------------" + e.getMessage());
//                    makeFile(newpath + "/" + filePath);
//                    InputStream stream = resource.getInputStream();
//                    write2File(stream, newpath + "/" + filePath);
//                }
//            }
//        } catch (Exception e) {
//            log.info("-------------" + e.getMessage());
//            // 跳过继续执行
//            e.printStackTrace();
//        }
//    }
//
//
//    /**
//     * 输入流写入文件
//     *
//     * @param is       输入流
//     * @param filePath 文件保存目录路径
//     * @throws IOException
//     */
//    public static void write2File(InputStream is, String filePath) throws IOException {
//        OutputStream os = new FileOutputStream(filePath);
//        int len = 8192;
//        byte[] buffer = new byte[len];
//        while ((len = is.read(buffer, 0, len)) != -1) {
//            os.write(buffer, 0, len);
//        }
//        os.close();
//        is.close();
//    }
//
//
//    /**
//     * 文件夹拼接随机名
//     *
//     * @return
//     */
//    public static String getTimeStr12() {
//        String timeStamp = (new SimpleDateFormat("yyyyMMddHHmmss")).format(new Date());
//        Random random = new Random();
//        for (int i = 0; i < 1; ++i) {
//            timeStamp = timeStamp + random.nextInt(10) + "";
//        }
//        return timeStamp;
//    }
//}
